package com.cskaoyan.javase.object._6clone.cloneable;

/**
 * 接口java.lang.Cloneable
 * 该接口是一个空接口
 * 那么这样的一个空接口,实现它有什么意义呢?
 * 实现空接口虽然并不能从接口中得到成员
 * 但是这个过程改变了这个实现类的数据类型:
 *      该类从原先不是这个空接口的子类变成了它的子类
 *      于是就可以配合关键字"instanceof"来完成一系列操作
 * 实际上clone方法的底层确实存在这样的校验,配合instanceof关键字来完成
 *
 * 总结,想java.lang.Cloneable这样的空接口,让一个类实现它,并不继承成员
 * 但是表示可以做某些操作的接口
 * 被称之为"标记接口",实现标记接口,就能够做某些操作
 *
 * @since 17:19
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    public static void main(String[] args) throws CloneNotSupportedException {
        /*Cat c = new Cat(1000, 8);
        Cat cloneCat = c.clone();
        cloneCat.price = 2000;
        System.out.println(c.price);*/
        judgeObjectImplIA(new A());
        judgeObjectImplIA(new B());
        judgeObjectImplIA(new C());
    }

    // 模拟一下克隆过程中,没有实现空接口的类会抛出异常
    public static void judgeObjectImplIA(Object o) {
        // 该方法用来判断o指向的对象,是否是实现了接口IA的类型对象
        // 如果是就允许做克隆操作,如果不是禁止克隆,并抛出异常
        if (o instanceof IA){
            // 实现了接口IA
            System.out.println("已经实现空接口,允许做克隆操作!");
        }else {
            System.out.println("没有实现空接口,禁止克隆,抛出异常!");
        }
    }
}
class A{}
class B implements IA{}
class C implements IASon{}
interface IASon extends IA{}
interface IA {
}

class Cat implements Cloneable {
    double price;
    int age;

    public Cat(double price, int age) {
        this.price = price;
        this.age = age;
    }

    @Override
    protected Cat clone() throws CloneNotSupportedException {
        return (Cat) super.clone();
    }
}
